package listgeneric.features;

import java.util.ArrayList;
import java.util.List;

/**
 * 泛型?
 * 1)泛型是什么?
 * 泛型是编译时的一种类型,用于约束类中属性,方法参数,返回值类型.但运行时无效,在编译时期被擦除
 * 2)泛型应用场景?(写框架-共性问题,写工具类,写通用方法)
 * 3)泛型应用类型?(类泛型,方法泛型)
 * 3.1)类泛型,语法类名或接口名<泛型>(class ClassA<T>{},class ClassB<K,V,P,D></>)
 * 类泛型约束类中实例属性,非静态方法参数,非静态返回值类型
 * 3.2)方法泛型:语法-><泛型>方法返回值类型<泛型> 方法名(参数列表)
 * 方法泛型应用最多的场景是静态方法(static <T>void print(T t){})
 * 4)泛型限定通配符
 * 4.1)?无界通配符
 * 4.2)? super      下届限定通配符
 * 4.3)? extends  上届限定通配符
 */
public class GenericTests01 {

    /**类泛型*/
    static class Container<E>{//new Container<String>()
        void add(E t){}
        E get(){return null;}
    }

    /**
     * 泛型方法,? super 只能应用于存数据
     * 限定下届通配符
     */
    static <T> void show(List<? super String> t){}

    /**
     * 限定上届通配符
     * @param t
     */
    static void display(List<? extends Number> t){}
    static <T extends Number>void  print(T t){}
    public static void main(String[] args) {
        print(100);
        //print("A");//报错只能传Number的子类型
        List<String> list1 = new ArrayList<>();
        show(list1);
        List<Integer> list2 = new ArrayList<>();
        //show(list2);//报错!!!不是String的父类类型

        List<Integer> list4 = new ArrayList<>();
        display(list4);
        List<String> list5 = new ArrayList<>();
        //display(list5);报错String不是Number的子类




        //笔试题
       // List<Object> list6 = new ArrayList<String>();//错误
        List<Object> list7 = new ArrayList<>();
        List<Object> list8 = new ArrayList<Object>();
        List<? extends  Object> list9 = new ArrayList<String>();

        List<? super String> list10 = new ArrayList<Object>();




    }
}
